/** Symbol类型的变量_items */
const _items = Symbol('stackItems');

/**
 * 模拟栈
 * 遵循先进后出的原则
 */
class Stack {
  constructor() {
    this[_items] = [];
  }

  /* 添加一个（或几个）新元素到栈顶 */
  push(element) {
    // 数组的首元素永远是栈底，即数组不断增长的末尾是栈顶
    this[_items].push(element);
  }

  /** 移除栈顶的元素，同时返回被移除的元素。 */
  pop() {
    return this[_items].pop();
  }

  /* 返回栈顶的元素，不对栈做任何修改（该方法不会移除栈顶的元素，仅仅返回它） */
  peek() {
    return this[_items][this[_items].length - 1];
  }

  /** 如果栈里没有任何元素就返回true，否则返回false。 */
  isEmpty() {
    return this[_items].length === 0;
  }

  /** 移除栈里的所有元素 */
  clear() {
    this[_items] = [];
  }

  /** 返回栈里的元素个数。该方法和数组的length属性很类似。 */
  size() {
    return this[_items].length;
  }

  print() {
    console.log(this[_items]);
  }
}

const stack = new Stack();
console.log(stack.isEmpty());
stack.push(5);
stack.push(8);

const objectSymbols = Object.getOwnPropertySymbols(stack);
console.log('objectSymbols.length: ', objectSymbols.length);
console.log('objectSymbols: ', objectSymbols);
console.log('objectSymbols[0]: ', objectSymbols[0]);

stack[objectSymbols[0]].push(1);
stack.print();
